/*-------------------------------------------------------------------------
  Author (C) 2008, Charles Wang <charlesw123456@gmail.com>

  This program is free software; you can redistribute it and/or modify it 
  under the terms of the GNU General Public License as published by the 
  Free Software Foundation; either version 2, or (at your option) any 
  later version.

  This program is distributed in the hope that it will be useful, but 
  WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 
  or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License 
  for more details.

  You should have received a copy of the GNU General Public License along 
  with this program; if not, write to the Free Software Foundation, Inc., 
  59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.

  As an exception, it is allowed to write an extension of Coco/R that is
  used as a plugin in non-free software.

  If not otherwise stated, any source code generated by Coco/R (other than 
  Coco/R itself) does not fall under the GNU General Public License.
-------------------------------------------------------------------------*/
#ifndef  COCO_GLOBALS_H
#define  COCO_GLOBALS_H

#ifndef  COCO_SYMBOLTABLE_H
#include  "SymbolTable.h"
#endif

#ifndef  COCO_LEXICAL_H
#include  "Lexical.h"
#endif

#ifndef  COCO_XMLSPECMAP_H
#include  "XmlSpecMap.h"
#endif

#ifndef  COCO_SYNTAX_H
#include  "Syntax.h"
#endif

EXTC_BEGIN

struct CcGlobals_s {
    CcsErrorPool_t  * errpool;
    const char      * templatePrefix;
    CcSymbolTable_t   symtab;
    CcLexical_t     * lexical;
    CcXmlSpecMap_t  * xmlspecmap;
    union {
	CcLexical_t    lexicalSpace;
	CcXmlSpecMap_t xmlspecmapSpace;
    } u;
    CcSyntax_t        syntax;

    CcArrayList_t     sections;
};

CcGlobals_t * CcGlobals(CcGlobals_t * self, CcsErrorPool_t * errpool);
CcGlobals_t * CcGlobalsXml(CcGlobals_t * self, CcsErrorPool_t * errpool);
void CcGlobals_Destruct(CcGlobals_t * self);

CcsBool_t CcGlobals_Finish(CcGlobals_t * self);

void CcGlobals_NewSection(CcGlobals_t * self, const char * secname,
			  CcsPosition_t * pos);
const CcsPosition_t *
CcGlobals_GetSection(const CcGlobals_t * self, const char * secname);

EXTC_END

#endif  /* COCO_GLOBALS_H */
